package hu.bme.iit.szlab4.continuity;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.List;

public class Tile {
	Pozicio tilepoz;
	int szelesseg, magassag;
	List<Palyaelem> palyaelemlista;
	boolean ures;
	boolean kezdo;

	// Tukor
	public Palyaelem getPalyaelem(int a) {
		System.out
				.println(Main.getTabok()
						+ "Visszateresi ertek: A parameter altal kivalasztott Palyaelem.");
		return new Fal();
	}

	// Tuzko
	public void setKoord(Pozicio poz) {
		// Ez a vegleges
	}

	// Tuzko
	public Pozicio getKoord() {
		// Input beolvasasanak elokeszitese
		BufferedReader reader = new BufferedReader(new InputStreamReader(
				System.in));
		;
		String sor = "inic";

		System.out.println(Main.getTabok()
				+ "Visszateresi ertek: Megadja a Tile aktualis helyzetet.");
		System.out
				.println(Main.getTabok()
						+ "Pozicio tipus, egy X es egy Y koordinatabol all, amelyek egesz szamok.");
		System.out.println(Main.getTabok()
				+ "Adja meg a visszateresi ertek X komponenset!");

		// Visszateresi ertek bekerese a felhasznalotol.
		// -1-el inicializalunk a ciklusfeltetel miatt
		int x = -1;
		while (!(x >= 0)) {
			try {
				sor = reader.readLine();
				x = Integer.parseInt(sor);
				if (!(x >= 0)) {
					throw new Exception();
				}
			} catch (Exception e) {
				// Hibas inputot hibauzenettel es ujboli bekeressel kezeljuk.
				System.out
						.println(Main.getTabok()
								+ "A bevitt ertek nem felel meg a megkoteseknek! Ezek a kovetkezok:");
				System.out.println(Main.getTabok()
						+ "Nullanal nagyobb gesz szam.");
			}
		}

		System.out.println(Main.getTabok()
				+ "Adja meg a visszateresi ertek Y komponenset!");
		// Visszateresi ertek bekerese a felhasznalotol.
		int y = -1; // -1-el inicializalunk a ciklusfeltetel miatt
		while (!(y >= 0)) {
			try {
				sor = reader.readLine();
				y = Integer.parseInt(sor);
				if (!(y >= 0)) {
					throw new Exception();
				}
			} catch (Exception e) {
				// Hibas inputot hibauzenettel es ujboli bekeressel kezeljuk.
				System.out
						.println(Main.getTabok()
								+ "A bevitt ertek nem felel meg a megkoteseknek! Ezek a kovetkezok:");
				System.out.println(Main.getTabok()
						+ "Nullanal nagyobb egesz szam");
			}
		}
		System.out.println(Main.getTabok() + "Visszateresi ertek: " + x + ","
				+ y);

		return new Pozicio(x, y);
	}
	
	//Tukor
	public boolean interakt(Jatekos j, boolean tileEgyforma){
		// Input beolvasasanak elokeszitese
		BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));;
		String sor = "inic";
		
		//Inicializalas blokk kiirasa.
		System.out.println("****************************************");
		System.out.println("Inicializalas. Objektumok letrehozasa.");
		System.out.println("");
		System.out.println("Letrehozott objektum: objektum: t:Tile");
		System.out.println("Letrehozott objektum: objektum: j:Jatekos");
		System.out.println("");
		System.out.println("Inicializalas vege");
		System.out.println("****************************************");
		System.out.println("\n-->");
		System.out.println("1. t.interakt(j,tileEgyforma):void");
		System.out.println("Vart parameterek:");
		System.out.println("j: Jatekos referencia");
		System.out.println("tileEgyforma: Megadja, hogy a Jatekos aktualis Tile-ja es a cel Tile kozott szabad-e az atjaras.");
		System.out.println("Logikai valtozo.");
		System.out.println("");

		
		//Elagazas kezelese, atmehet-e a Jatekos a cel Tile-ba
		System.out.println(Main.getTabok() + "atmehet a Jatekos a cel Tile-ba?");
		System.out.println(Main.getTabok() + "Egy egesz szam megadasaval adhato meg, aminek jelentese: 0 - nem, 1 - igen ");
		System.out.println(Main.getTabok() + "Adja meg a valaszt!");
		//Valasz bekerese a felhasznalotol.
		int i = 10; //i-t azert 10-el inicializaljuk, mert a 0-as es 1-es ertek ertelmezve van a kesobbi logikai valtozo vizsgalatokban
		while((i != 0) && (i != 1)){
			try {
				sor = reader.readLine();
				i = Integer.parseInt(sor);
				if((i != 0) && (i != 1)){ 
					throw new Exception();
				}
			} catch (Exception e) {
				//Hibas inputot hibauzenettel es ujboli bekeressel kezeljuk.
				System.out.println(Main.getTabok() + "A bevitt valasz nem felel meg a megkoteseknek! Ezek a kovetkezok:");
				System.out.println(Main.getTabok() + "Egesz szam. 0 vagy 1. Jelentese: 0 - nem, 1 - igen");			}
		}
		System.out.println(Main.getTabok() + "Dontes: " + i);
		
		//Ha atmehet a Jatekos...
		if(i == 1){
			//----------------------------------------
			//Meghivjuk a j:Jatekos atmegy metodusat.
			Main.hivasszam++;
			Main.tabszam++;
			
			System.out.println(Main.getTabok() + "-->");
			//A hivasok szamat azert a Main hivaszam valtozoja alapjan irjuk ki, mert az opt-ok miatt az nem allando.
			System.out.println(Main.getTabok() + "1."+Main.hivasszam+" Hivott metodus: j.atmegy(t):void");
			System.out.println(Main.getTabok() + "Vart parameterek:");
			System.out.println(Main.getTabok() + "t: a cel Tile referenciaja");
			
			//A konkret metodushivas
			j.atmegy(this);		
			System.out.println(Main.getTabok() + "<- -");
			Main.tabszam--;
			
			//Visszateres...
			System.out.println(Main.getTabok() + "Visszateresi ertek: Megadja, hogy a Jatekos meghalt-e, itt kizarolag false erteket vehet fel.");
			System.out.println(Main.getTabok() + "Logikai valtozo. Egy egesz szam megadasaval adhato meg, aminek jelentese: 0 - nem, 1 - igen ");
			System.out.println(Main.getTabok() + "Adja meg a visszateresi erteket!");
			//Visszateresi ertek bekerese a felhasznalotol.
			i = 10; //i azert kap ujbol 10-es erteket, mert a 0-as es 1-es ertek ertelmezve van a kesobbi logikai valtozo vizsgalatokban
			while(i != 0){
				try {
					sor = reader.readLine();
					i = Integer.parseInt(sor);
					if(i != 0){ 
						throw new Exception();
					}
				} catch (Exception e) {
					//Hibas inputot hibauzenettel es ujboli bekeressel kezeljuk.
					System.out.println(Main.getTabok() + "A bevitt visszateresi ertek nem felel meg a megkoteseknek! Ezek a kovetkezok:");
					System.out.println(Main.getTabok() + "Egesz szam. 0 vagy 1. Jelentese: 0 - nem, 1 - igen. Kizarolag false erteket vehet fel.");			}
			}
			System.out.println(Main.getTabok() + "Visszateresi ertek: " + i);
			System.out.println(Main.getTabok() + "<- -");
			
			//Metodushivasok es tabok szamanak nullazasa.
			Main.hivasszam = 0;
			Main.tabszam = 0;
			
			return (i == 1) ? true : false;
		} else { //Ha nem mehet at a Jatekos...
			//Meghivjuk a j:Jatekos getIrany metodusat.
			Main.hivasszam++;
			Main.tabszam++;
			
			System.out.println(Main.getTabok() + "-->");
			//A hivasok szamat azert a Main hivaszam valtozoja alapjan irjuk ki, mert az opt-ok miatt az nem allando.
			System.out.println(Main.getTabok() + "1."+Main.hivasszam+" Hivott metodus: j.getIrany():double");
			
			//A konkret metodushivas
			j.getIrany();		
			System.out.println(Main.getTabok() + "<- -");
			Main.tabszam--;
			
			//Elagazas kezelese, lefele esett-e a Jatekos
			System.out.println(Main.getTabok() + "Lefele esett a Jatekos?");
			System.out.println(Main.getTabok() + "Egy egesz szam megadasaval adhato meg, aminek jelentese:");
			System.out.println(Main.getTabok() + "0 - nem, 1 - igen");
			System.out.println(Main.getTabok() + "Adja meg a valaszt!");
			//Valasz bekerese a felhasznalotol.
			i = 10; //i azert kap ujbol 10-es erteket, mert a 0-as es 1-es ertek ertelmezve van a kesobbi logikai valtozo vizsgalatokban
			while((i != 0) && (i != 1)){
				try {
					sor = reader.readLine();
					i = Integer.parseInt(sor);
					if((i != 0) && (i != 1)){ 
						throw new Exception();
					}
				} catch (Exception e) {
					//Hibas inputot hibauzenettel es ujboli bekeressel kezeljuk.
					System.out.println(Main.getTabok() + "A bevitt valasz nem felel meg a megkoteseknek! Ezek a kovetkezok:");
					System.out.println(Main.getTabok() + "Egesz szam. 0 vagy 1. Jelentese: 0 - nem, 1 - igen.");		
				}
			}
			System.out.println(Main.getTabok() + "Dontes: " + i);
			
			if(i == 1){ //lefele esett
				//Visszateres...
				System.out.println(Main.getTabok() + "Visszateresi ertek: Megadja, hogy a Jatekos meghalt-e, itt kizarolag true erteket vehet fel.");
				System.out.println(Main.getTabok() + "Logikai valtozo. Egy egesz szam megadasaval adhato meg, aminek jelentese: 0 - nem, 1 - igen ");
				System.out.println(Main.getTabok() + "Adja meg a visszateresi erteket!");
				//Visszateresi ertek bekerese a felhasznalotol.
				i = 10; //i azert kap ujbol 10-es erteket, mert a 0-as es 1-es ertek ertelmezve van a kesobbi logikai valtozo vizsgalatokban
				while(i != 1){
					try {
						sor = reader.readLine();
						i = Integer.parseInt(sor);
						if(i != 1){ 
							throw new Exception();
						}
					} catch (Exception e) {
						//Hibas inputot hibauzenettel es ujboli bekeressel kezeljuk.
						System.out.println(Main.getTabok() + "A bevitt visszateresi ertek nem felel meg a megkoteseknek! Ezek a kovetkezok:");
						System.out.println(Main.getTabok() + "Egesz szam. 0 vagy 1. Jelentese: 0 - nem, 1 - igen. Kizarolag true erteket vehet fel.");			}
				}
				System.out.println(Main.getTabok() + "Visszateresi ertek: " + i);
				System.out.println(Main.getTabok() + "<- -");
				
				//Metodushivasok es tabok szamanak nullazasa.
				Main.hivasszam = 0;
				Main.tabszam = 0;
				
				return (i == 1) ? true : false;
			} else { //felfele ugrott vagy jobbra vagy balra lepett
				//Meghivjuk a t.:Tile korrekcio metodusat.
				Main.hivasszam++;
				Main.tabszam++;
				
				System.out.println(Main.getTabok() + "-->");
				//A hivasok szamat azert a Main hivaszam valtozoja alapjan irjuk ki, mert az opt-ok miatt az nem allando.
				System.out.println(Main.getTabok() + "1."+Main.hivasszam+" Hivott metodus: this.korrekcio(j):double");
				System.out.println(Main.getTabok() + "Vart parameterek:");
				System.out.println(Main.getTabok() + "j: Jatekos referencia");
				
				//A konkret metodushivas
				this.korrekcio(j);		
				System.out.println(Main.getTabok() + "<- -");
				Main.tabszam--;
				
				//Visszateres...
				System.out.println(Main.getTabok() + "Visszateresi ertek: Megadja, hogy a Jatekos meghalt-e, itt kizarolag false erteket vehet fel.");
				System.out.println(Main.getTabok() + "Logikai valtozo. Egy egesz szam megadasaval adhato meg, aminek jelentese: 0 - nem, 1 - igen ");
				System.out.println(Main.getTabok() + "Adja meg a visszateresi erteket!");
				//Visszateresi ertek bekerese a felhasznalotol.
				i = 10; //i azert kap ujbol 10-es erteket, mert a 0-as es 1-es ertek ertelmezve van a kesobbi logikai valtozo vizsgalatokban
				while(i != 0){
					try {
						sor = reader.readLine();
						i = Integer.parseInt(sor);
						if(i != 0){ 
							throw new Exception();
						}
					} catch (Exception e) {
						//Hibas inputot hibauzenettel es ujboli bekeressel kezeljuk.
						System.out.println(Main.getTabok() + "A bevitt visszateresi ertek nem felel meg a megkoteseknek! Ezek a kovetkezok:");
						System.out.println(Main.getTabok() + "Egesz szam. 0 vagy 1. Jelentese: 0 - nem, 1 - igen. Kizarolag false erteket vehet fel.");			}
				}
				System.out.println(Main.getTabok() + "Visszateresi ertek: " + i);
				System.out.println(Main.getTabok() + "<- -");
				
				//Metodushivasok es tabok szamanak nullazasa.
				Main.hivasszam = 0;
				Main.tabszam = 0;	
				
				return (i == 1) ? true : false;
			}
		}	
	}

	// Tuzko
	public boolean metszette(Jatekos j) {

		int valasz = 0;
		System.out.println(Main.getTabok()
				+ "Visszateresi ertek: Metszette a jatekos a Tile-t?");
		System.out.println(Main.getTabok() + "0 - nem");
		System.out.println(Main.getTabok() + "1 - igen");
		System.out
				.println(Main.getTabok() + "Adja meg a visszateresi erteket!");
		// Beolvassuk a felhasznalo altal megadott erteket es utana
		// leellenorizzuk.
		// A ciklus leall, ha az ok boolean valtozo true lesz - ekkor megfelelo
		// a bevitt adat
		// A felhasznaloi input ellenorzese.
		boolean ok = false;
		while (!ok) {
			try {
				BufferedReader consoleIn = new BufferedReader(
						new InputStreamReader(System.in));
				String stringInt = consoleIn.readLine();
				valasz = Integer.parseInt(stringInt);
				if (valasz == 0 || valasz == 1)
					ok = true;
				else
					throw new Exception();

				// Ha a felhasznalo nem megfelelo adatot vitt be, akkor
				// kivetel dobodik es azt itt kezeljuk.
				// Kiirjuk, hogy nem megfelelo a bevitt adat es ujbol
				// leirjuk a kriteriumokat.
			} catch (Exception e) {
				System.out.println(Main.getTabok()
						+ "A bevitt parameter nem felel "
						+ "meg a megkoteseknek! Ezek a kovetkezok:\n"
						+ Main.getTabok() + "0 - nem\n" + Main.getTabok()
						+ "1 - igen\n" + Main.getTabok()
						+ "Adja meg a visszateresi erteket!");
			}
		}
		if (valasz == 0) {
			System.out.println(Main.getTabok() + "Visszateresi ertek: 0 - nem");
			return false;
		} else {
			System.out
					.println(Main.getTabok() + "Visszateresi ertek: 1 - igen");
			return true;
		}

	}

	
	//Tukor
	public void korrekcio(Jatekos j){
		// Input beolvasasanak elokeszitese
		BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));;
		String sor = "inic";
		
		//Meghivjuk a j:Jatekos getIrany metodusat
		Main.tabszam++;
		
		System.out.println(Main.getTabok() + "-->");
		//A hivasok szamat azert a Main hivaszam valtozoja alapjan irjuk ki, mert az opt-ok miatt az nem allando.
		System.out.println(Main.getTabok() + "1."+Main.hivasszam+".1 Hivott metodus: j.getIrany():double");
		
		//A konkret metodushivas
		j.getIrany();		
		System.out.println(Main.getTabok() + "<- -");
		Main.tabszam--;
		
		//Elagazas kezelese, felfele ugrott-e a Jatekos
		System.out.println(Main.getTabok() + "Felfele ugrott a Jatekos?");
		System.out.println(Main.getTabok() + "Egy egesz szam megadasaval adhato meg, aminek jelentese:");
		System.out.println(Main.getTabok() + "0 - nem, 1 - igen");
		System.out.println(Main.getTabok() + "Adja meg a valaszt!");
		//Valasz bekerese a felhasznalotol.
		int i = 10; //i-t azert 10-el inicializaljuk, mert a 0-as es 1-es ertek ertelmezve van a kesobbi logikai valtozo vizsgalatokban
		while((i != 0) && (i != 1)){
			try {
				sor = reader.readLine();
				i = Integer.parseInt(sor);
				if((i != 0) && (i != 1)){ 
					throw new Exception();
				}
			} catch (Exception e) {
				//Hibas inputot hibauzenettel es ujboli bekeressel kezeljuk.
				System.out.println(Main.getTabok() + "A bevitt valasz nem felel meg a megkoteseknek! Ezek a kovetkezok:");
				System.out.println(Main.getTabok() + "Egesz szam. 0 vagy 1. Jelentese: 0 - nem, 1 - igen.");		
			}
		}
		System.out.println(Main.getTabok() + "Dontes: " + i);
		
		//Meghivjuk a j:Jatekos setAktKoord metodusat.
		Main.tabszam++;
		
		System.out.println(Main.getTabok() + "-->");
		//A hivasok szamat azert a Main hivaszam valtozoja alapjan irjuk ki, mert az opt-ok miatt az nem allando.
		System.out.println(Main.getTabok() + "1."+Main.hivasszam+".2 Hivott metodus: j.setAktKoord(pos):void");
		System.out.println(Main.getTabok() + "Vart parameterek:");
		System.out.println(Main.getTabok() + "pos: A Jatekos uj pozicioja.");
		System.out.println(Main.getTabok()+ "Pozicio tipus, egy X es egy Y koordinatabol all, amelyek egesz szamok.");
		System.out.println(Main.getTabok()+ "Adja meg a parameter X komponenset!");

		//Parameter bekerese a felhasznalotol.
		int x = -1; // -1-el inicializalunk a ciklusfeltetel miatt
		while (!(x >= 0)) {
			try {
				sor = reader.readLine();
				x = Integer.parseInt(sor);
				if (!(x >= 0)) {
					throw new Exception();
				}
			} catch (Exception e) {
				// Hibas inputot hibauzenettel es ujboli bekeressel kezeljuk.
				System.out.println(Main.getTabok()+ "A bevitt ertek nem felel meg a megkoteseknek! Ezek a kovetkezok:");
				System.out.println(Main.getTabok()+ "Nullanal nagyobb gesz szam.");
			}
		}

		System.out.println(Main.getTabok()+ "Adja meg a parameter ertek Y komponenset!");
		//Parameter bekerese a felhasznalotol.
		int y = -1; // -1-el inicializalunk a ciklusfeltetel miatt
		while (!(y >= 0)) {
			try {
				sor = reader.readLine();
				y = Integer.parseInt(sor);
				if (!(y >= 0)) {
					throw new Exception();
				}
			} catch (Exception e) {
				// Hibas inputot hibauzenettel es ujboli bekeressel kezeljuk.
				System.out.println(Main.getTabok()+ "A bevitt visszateresi ertek nem felel meg a megkoteseknek! Ezek a kovetkezok:");
				System.out.println(Main.getTabok()+ "Nullanal nagyobb egesz szam");
			}
		}
		System.out.println(Main.getTabok() + "Parameter: " + x + ","+ y);
		
		//A konkret metodushivas
		j.setAktKoord(new Pozicio(x,y));		
		System.out.println(Main.getTabok() + "<- -");
		Main.tabszam--;
		
		//Meghivjuk a j:Jatekos setIrany metodusat.
		Main.tabszam++;
		
		System.out.println(Main.getTabok() + "-->");
		//A hivasok szamat azert a Main hivaszam valtozoja alapjan irjuk ki, mert az opt-ok miatt az nem allando.
		System.out.println(Main.getTabok()+ "1."+Main.hivasszam+".3 Hivott metodus: j.setIrany(ujIrany):void");
		System.out.println(Main.getTabok()+ "Vart parameterek:");
		System.out.println(Main.getTabok()+ "ujIrany: A Jatekos uj iranya.");
		System.out.println(Main.getTabok()+ "Double tipus. 0 es 2*PI kozti ertek.");
		System.out.println(Main.getTabok()+ "Adja meg a parametert!");
		
		//Parameter bekerese a felhasznalotol.
		double ujRadIrany = -1; // -1-el inicializalunk a ciklusfeltetel miatt
		while (!(ujRadIrany >= 0) || !(ujRadIrany <= 2*Math.PI)) {
			try {
				sor = reader.readLine();
				ujRadIrany = Double.parseDouble(sor);
				if (!(ujRadIrany >= 0) || !(ujRadIrany <= 2*Math.PI)) {
					throw new Exception();
				}
			} catch (Exception e) {
				// Hibas inputot hibauzenettel es ujboli bekeressel kezeljuk.
				System.out.println(Main.getTabok()+ "A bevitt ertek nem felel meg a megkoteseknek! Ezek a kovetkezok:");
				System.out.println(Main.getTabok()+ "Double tipus. 0 es 2*PI kozti ertek.");
			}
		}
		
		//A konkret metodushivas
		j.setIrany(ujRadIrany);		
		System.out.println(Main.getTabok() + "<- -");
		Main.tabszam--;
		
		if(i == 1){//felfele ugrott a Jatekos
			Main.tabszam++;
			
			//Meghivjuk a j:Jatekos setUgras metodusat
			System.out.println(Main.getTabok() + "-->");
			//A hivasok szamat azert a Main hivaszam valtozoja alapjan irjuk ki, mert az opt-ok miatt az nem allando.
			System.out.println(Main.getTabok()+ "1."+Main.hivasszam+".4 Hivott metodus: j.setUgras(ugras):void");
			System.out.println(Main.getTabok()+ "Vart parameterek:");
			System.out.println(Main.getTabok()+ "ugras: A Jatekos uj ugras erteke");
			System.out.println(Main.getTabok()+ "Egesz tipus. -10 es 10 kozott (ez a Jatekos max ugrasi magassaga).");
			System.out.println(Main.getTabok()+ "Adja meg a parametert!");
			
			//Parameter bekerese a felhasznalotol.
			int ugras = -15; // -20-al inicializalunk a ciklusfeltetel miatt
			while (!(ugras >= -10) || !(ugras <= 10)) {
				try {
					sor = reader.readLine();
					ugras = Integer.parseInt(sor);
					if (!(ugras >= -10) || !(ugras <= 10)) {
						throw new Exception();
					}
				} catch (Exception e) {
					// Hibas inputot hibauzenettel es ujboli bekeressel kezeljuk.
					System.out.println(Main.getTabok()+ "A bevitt ertek nem felel meg a megkoteseknek! Ezek a kovetkezok:");
					System.out.println(Main.getTabok()+ "Egesz tipus. -10 es 10 kozott.");
				}
			}
			
			//A konkret metodushivas
			j.setIrany(ujRadIrany);		
			System.out.println(Main.getTabok() + "<- -");
			Main.tabszam--;
		}
		
	}

	public void init(Palyaelem p) {

	}

	// Tuzko
	public boolean getUres() {

		// a felhasznaloi bemenet eltarolasahoz
		int valasz;

		System.out.println(Main.getTabok() + "ures a Tile?");
		System.out.println(Main.getTabok() + "0 - nem");
		System.out.println(Main.getTabok() + "1 - igen");

		// A felhasznaloi input ellenorzese.
		boolean ok = false;
		while (!ok) {
			try {
				BufferedReader consoleIn = new BufferedReader(
						new InputStreamReader(System.in));
				String stringInt = consoleIn.readLine();
				valasz = Integer.parseInt(stringInt);
				if (valasz == 0 || valasz == 1)
					ok = true;
				else
					throw new Exception();

				// Ha a felhasznalo nem megfelelo adatot vitt be, akkor
				// kivetel dobodik es azt itt kezeljuk.
				// Kiirjuk, hogy nem megfelelo a bevitt adat es ujbol
				// leirjuk a kriteriumokat.
			} catch (Exception e) {
				System.out.println(Main.getTabok()
						+ "A bevitt parameter nem felel "
						+ "meg a megkoteseknek! Ezek a kovetkezok:\n"
						+ Main.getTabok() + "0 - nem\n" + Main.getTabok()
						+ "1 - igen\n" + Main.getTabok());
			}
		}
		return true;
	}

	public boolean getKezdo() {
		// nem vegleges return value, csak sikitana az eclipse, ha itt nem lenne
		// semmi. Nyugodtan irjatok at!
		return true;
	}

}
